import { scene, camera, renderer } from './utils/init2d'
import * as THREE from 'three'

import { CSS2DObject } from 'three/addons/renderers/CSS2DRenderer.js';
// 目标：使用 three.js 中的精灵物体
// 精灵物体：一个总面朝着摄像机的平面，通常使用一个半透明的纹理
// 使用：
// 1. 准备纹理对象并加载图片素材
// 2. 使用 SpriteMaterial 精灵材质
// 3. 使用 Sprite 创建精灵物体并加入场景

// 区别：
// CSS3D：始终不面向摄像机，场景缩放时跟随着变大/变小，不被模型遮挡，通过 DOM 事件点击
// CSS2D：始终面向摄像机，  场景缩放时不跟随变化，     不被模型遮挡，通过 DOM 事件点击
// 精灵体：始终面向摄像机，  场景缩放时跟随着变大/变小，被模型遮挡，  通过光射投影交互
// 平面体：始终不面向摄像机，场景缩放时跟随着变大/变小，被模型遮挡，  通过光射投影交互

let sphere // 球体对象
let helper // 平行光辅助对象
function createFloor() {
  const geometry = new THREE.PlaneGeometry(10, 10)
  const material = new THREE.MeshStandardMaterial({
    color: 0xffffff,
    side: THREE.DoubleSide
  })
  const plane = new THREE.Mesh(geometry, material)
  plane.rotation.set(- Math.PI / 2, 0, 0)
  plane.receiveShadow = true
  scene.add(plane)
}
// 灯光
function createLight() {
  // 环境光
  // const light = new THREE.AmbientLight(0xffffff, 1)
  // scene.add(light)

  // 点光源（灯泡）
  // const light = new THREE.PointLight(0xffffff, 1, 100);
  // light.position.set(3, 3, 3);
  // scene.add(light);

  // const pointLightHelper = new THREE.PointLightHelper(light, 1);
  // scene.add(pointLightHelper);

  // 平行光（太阳）
  const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
  directionalLight.position.set(3, 3, 3);
  directionalLight.castShadow = true
  directionalLight.target = sphere
  scene.add(directionalLight);

  directionalLight.target = sphere
  helper = new THREE.DirectionalLightHelper(directionalLight, 1);
  scene.add(helper);


  // 聚光灯（手电）
  // const spotLight = new THREE.SpotLight(0xffffff, 1);
  // spotLight.position.set(13, 13, 13);
  // // spotLight.map = new THREE.TextureLoader().load('image/desert.jpg');

  // spotLight.castShadow = true

  // spotLight.shadow.mapSize.width = 2048;
  // spotLight.shadow.mapSize.height = 2048;

  // scene.add(spotLight)

  // const spotLightHelper = new THREE.SpotLightHelper(spotLight);
  // scene.add(spotLightHelper);
}
function createSphere() {
  const geometry = new THREE.SphereGeometry(1, 32, 16)
  const material = new THREE.MeshStandardMaterial({
    color: 0x00ff00
  })
  sphere = new THREE.Mesh(geometry, material)
  sphere.position.set(0, 1, 0)
  sphere.castShadow = true
  scene.add(sphere)
}

// 2D
function create2d() {
    //  创建dom标签
    const div = document.createElement('div')
    div.innerHTML ='球体'
    div.style.color = 'red'
    div.style.fontSize = '32px'
// 与SCC3D 区别：2D物体 px 像素还可以生效，而不是平移到三维空间中的单位

    // dom标签转为2d 物体加入到场景中使用
    const objest2d = new CSS2DObject( div )
    objest2d.position.set(0,3,0)
    scene.add(objest2d)
}

// 精灵物体
function createSprite() {
  // 使用：
  // 1.准备纹理对象并加载图片素材
  const texture = (new THREE.TextureLoader()).load('image/pkq.jpg')

  // 2.使用SpriteMaterial 精灵材质
  const material = new THREE.SpriteMaterial({ map : texture })
  //  使用Sprite 创建精灵物体并加入场景
  const sprite = new THREE.Sprite(material)
  sprite.position.set(3, 0.5 , -3)

  scene.add(sprite)


}



camera.position.set(5, 5, 5)
renderer.shadowMap.enabled = true

// 球体
createSphere()
// 平面
createFloor()
// 灯光
createLight()
create2d() 
// 精灵物体
createSprite()